package com.leyou.goodspage.service;

import com.leyou.goodspage.utils.ThreadUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.util.FileCopyUtils;
import org.thymeleaf.TemplateEngine;
import org.thymeleaf.context.Context;

import java.io.*;


@Service
public class FileService {

    @Autowired
    private GoodsService goodsService;

    @Autowired
    private TemplateEngine templateEngine;

    @Value("${ly.thymeleaf.destPath}")
    private String destPath;

    //创建html页面
    public void createHtml(Long id) throws Exception {
        //创建上下文对象
        Context context = new Context(); //thymeleaf中的上下文对象，注意不要引错包

        //将模板数据加入到上下文对象
        context.setVariables(this.goodsService.loadModel(id));

        //创建输出流，关联到一个临时文件
        File temp = new File(id + ".html");

        //创建目标页面文件
        File dest = createPath(id);

        //备份原页面文件
        File bak = new File(id + "_bak.html");

        try (PrintWriter writer = new PrintWriter(temp, "UTF-8")) {
            //利用thymeleaf模板引擎生成静态页面
            templateEngine.process("item", context, writer);

            //如果目标文件存在，先备份
            if (dest.exists()) {
                dest.renameTo(bak);
            }
            //将新页面覆盖就页面
            FileCopyUtils.copy(temp, dest);
            //操作成功后，删除原备份页面
            bak.delete();
        } catch (IOException e) {
            //操作失败后，将备份页面进行恢复
            bak.renameTo(dest);
            //重新抛出异常
            throw new Exception(e);
        } finally {
            //不管成功与否，最终都要删除临时页面
            temp.delete();
        }
    }

    private File createPath(Long id) {
        if (id == null) {
            return null;
        }

        File dest = new File(this.destPath);
        if (!dest.exists()) {
            dest.mkdirs();
        }

        return new File(dest, id + ".html");
    }

    //判断某个商品页面是否存在
    public boolean existsOrNot(Long id) {
        return this.createPath(id).exists();
    }

    //异步创建html页面
    //生成html 的代码不能对用户请求产生影响，所以这里我们使用额外的线程进行异步创建
    public void syncCreateHtml(Long id) {
        ThreadUtils.execute(() -> {
            try {
                createHtml(id);
            } catch (Exception e) {
                e.printStackTrace();
            }
        });
    }

    //删除页面的方法
    public void deleteHtml(Long id) {
        File file = new File(this.destPath, id + ".html");
        file.delete();
    }


}
